#!/usr/bin/qdroid
#codepage=Utf-8

/*
v 2009.08.31_адаптирован под новую среду

*/

/*needs Hive_version:0.01+*/
/*needs class:t_FileList*/
/*needs class:t_FileListElment*/
/*needs class:t_TreeWidget*/
/*needs class:t_TreeWidgetItem*/
/*needs object:BBot*/
/*needs option:CompareDir1:Каталог рабочей ветки*/
/*needs option:CompareDir2:Каталог отчетной ветки*/

/*
 в начале вкрипта - некотрые метаданные.

Сейчас анализируются только первая и вторая строки - в том числе и для распознавания кодироваки.

needs option:CompareDir1:Каталог рабочей ветки
определяет опции которые должны быть определны перед запуском скрипта.
Эти опции являются настройками конкретного экземпляра - можно загрузить несколько
копий скрипта и настроить их на разные опции. 

*/
//---------------------------------------------------
	var VersionString="2009.08.21<-2008.12.09_1200";
	var TreeWidget;//виджет - оболочка для дерева
	var FList_Dir1=new t_FileList;
	var FList_Etalon=new t_FileList;
	
	var StrAdded="new";
	var StrDeleted="DELETED!";
	
	var StrStatePropertyName="State";
	var StrNotePropertyName="Note";
	
	//номера колонок
	var ID_STD_COLUMN=10; //станлартно! не меняется
	var ColumnNote=2;
	var ColumnState=1;
	//var ColumnDelete=4;

	//BBot доступен всегда, потому можно сразу
	/**/
	Dir1=BBot.app_dir()+"/test_area/dir_sample1"; //директория которую отслеживаем
	DirXmlFile=BBot.app_dir()+"/DirCompare/test_area_dir_sample1_changes.xml";// гже бум. хранить то что отследили
	
	
	ScanDeep=10;
	// при заполнении relative_paths - нужным образом заполнится ID - относит. путем.
	// пути - в обратных слешах даже в виндоус!


//---------------------------------------------------
function main()
{
	print ("Демо-Программа отслеживания изменений в каталоге.\n Добро пожаловать!");
	
	
	operation=2;
	//получим фактическое состояние файлов
	FList_Dir1.update_from_dir(Dir1,ScanDeep);
	FList_Dir1.fill_relative_paths(Dir1); 
	FList_Dir1.make_tree_struct();
	
	//получим эталонный список
	rez=FList_Etalon.load_from_file(DirXmlFile); 
	FList_Etalon.make_tree_struct();
	
	//Теперь сравним их
	//найдем добавленные файлы - это 
	//  FList_Dir1-FList_Etalon
	FList_Added=FList_Dir1.copy();
	FList_Added.subtract(FList_Etalon);
	FList_Added.remove_all_item_properties();
	FList_Added.set_property(StrStatePropertyName,StrAdded);
	
	//Сначала найдем удаленные файлы - это 
	//  FList_Etalon-FList_Dir1
	FList_Deleted=FList_Etalon.copy();
	FList_Deleted.subtract(FList_Dir1);
	FList_Deleted.remove_all_item_properties();
	FList_Deleted.set_property(StrStatePropertyName,StrDeleted);
	
	//общий список файлов
	Flist_United=FList_Dir1.copy();
	Flist_United.remove_all_item_properties();
	ReplacePropertyValues=true; UnitePropertySets=false;
	Flist_United.unite_w_properties(FList_Etalon,ReplacePropertyValues, UnitePropertySets);
	Flist_United.remove_item_property(StrStatePropertyName);
	
	
	//теперь добавим туда атрибуты для нужных элементов
	ReplacePropertyValues=true; UnitePropertySets=true;
	Flist_United.unite_w_properties(FList_Added,ReplacePropertyValues, UnitePropertySets);
	Flist_United.unite_w_properties(FList_Deleted,ReplacePropertyValues, UnitePropertySets);
	
	
	TreeWidget=Flist_United.create_tree_widget(""+StrStatePropertyName+","+StrNotePropertyName);
	
	TreeWidget.set_colomn_width(0,300);
	TreeWidget.set_colomn_width(1,100);
	TreeWidget.set_colomn_width(3,300);
	
	// настроим поведение окна
	//TreeWidget.item_clicked.connect(handler_item_clicked);
	TreeWidget.item_double_clicked.connect(handler_item_double_clicked);
	TreeWidget.enable_edittriggers(0);//запускать редактирование будем вручную по сигналу. см обработчики событий.
	TreeWidget.set_selection_behavior(1);// выделять - только ячейку. для нашей задачи - это удобнее.
	
	TreeWidget.set_size(800,500);//размерчег подправим
	TreeWidget.set_pos(50,50);
	TreeWidget.windowTitle="Отслеживание изменений в каталоге. QDroid Demo. ("+VersionString+")";
	
	TreeWidget.set_header_labels(""+Dir1+",Статус,Заметка");
	//развернем дерево
	expand_all_items(TreeWidget);
	
	
	
	TreeWidget.show();
	
	
	// настройка и привязки кнопок
	// 4 горизонтальные кнопки
	//TreeWidget.get_button("pushButton_1").visible=false;
	ButtonAdded=TreeWidget.get_button("pushButton_1");
	TreeWidget.get_button("pushButton_2").visible=false;
	//TreeWidget.get_button("pushButton_3").visible=false;
	ButtonDeleted=TreeWidget.get_button("pushButton_3");
	
	TreeWidget.get_button("pushButton_4").visible=false;
	
	// 4 вертикальные кнопки
	ButtonApply=TreeWidget.get_button("pushButton_5");
	TreeWidget.get_button("pushButton_6").visible=false;
	ButtonCancel=TreeWidget.get_button("pushButton_7");
	ButtonHelp=TreeWidget.get_button("pushButton_8");
	
	ButtonAdded.text="Показать Добавленное";
	ButtonAdded.clicked.connect(clicked_added_show);
	
	ButtonDeleted.text="Показать Удаленное";
	ButtonDeleted.clicked.connect(clicked_deleted_show);
	
	ButtonApply.text="Сохранить";
	ButtonApply.clicked.connect(clicked_apply);
	
	ButtonCancel.text="[X] Отменить";
	ButtonCancel.clicked.connect(clicked_cancel);
	
	ButtonHelp.text="(i)Помощь";
	ButtonHelp.clicked.connect(clicked_help);
	
	
	return ("ok");
  };//main()
//=============================================================================
//сервисное
function expand_all_items(_TreeWidget)
{
  items_count=_TreeWidget.index_items();//проиндексируем что-бы модно было обращаться по номеру
  var q;
  for (q=0;q<items_count;q++) _TreeWidget.expandItem(_TreeWidget.indexed_item(q)); 
};

//------------------------------------------------------------------------
// перехватчики кликов
function handler_item_double_clicked(WidgetItem,Column)
{
     // print ("double clicked Column="+Column+" ColumnCopy="+ColumnCopy);
	  		  if (Column==ColumnNote)
            {
              TreeWidget.EditItem(WidgetItem,Column);
            }; 
};

function handler_item_clicked(WidgetItem,Column)
{
      handler_item_double_clicked(WidgetItem,Column);
};

//------------------------------------------------------------------------
// обработка нажатий кнопок


function clicked_added_show()
{
  TreeWidget1=FList_Added.create_tree_widget(""+StrStatePropertyName+","+StrNotePropertyName);
  TreeWidget1.windowTitle="Добавленные файлы";
  TreeWidget1.hide_all_buttons();
  TreeWidget1.set_colomn_width(0,300);
  expand_all_items(TreeWidget1);
  TreeWidget1.show();
}

function clicked_deleted_show()
{
  TreeWidget0=FList_Deleted.create_tree_widget(""+StrStatePropertyName+","+StrNotePropertyName);
  TreeWidget0.windowTitle="Удаленные файлы";
  TreeWidget0.hide_all_buttons();
  TreeWidget0.set_colomn_width(0,300);
  expand_all_items(TreeWidget0);
  TreeWidget0.show();
}

function clicked_apply()
{
   print (" processing ...\n ");
   process_files();
}

function clicked_cancel()
{
  TreeWidget.close();
}

function clicked_help()
{
var HelpText;
HelpText=" \"Мониторинг Изменений Каталога\"\
Это демо-скрипт для QDoid.\n\
Данный скрипт отслеживает изменения в содержимом директории\
и позволяет вести по каждому файлу заметки.\
 v."+VersionString+" \
 (а)2008г. Denjs (2008)\
 \
 \
 Для добавления заметки к файлу,\
 кликните на ячейке напротив файла в колонке Notes.\
 ";
 BBot.msgbox_information("QDroid Demo script help.",HelpText,1);  
}

function process_files()
{
  
  items_count=TreeWidget.index_items();//проиндексируем что-бы можно было обращаться по номеру
  var q,ID,Note,Pos,Message;
  var ListElement,TreeWidgetItem;
  
  //пробежимся по списку элементов и определим у них свойство Note
  for (q=0;q<items_count;q++)
   {
    TreeWidgetItem=TreeWidget.indexed_item(q);
    ID=TreeWidgetItem.get_text(ID_STD_COLUMN);
    Note=TreeWidgetItem.get_text(ColumnNote);
    State=TreeWidgetItem.get_text(ColumnState);

    Pos=FList_Dir1.get_pos_by_id(ID);
     if (Pos<0) continue; //элемент который удален - его нет в списке актуальных файлов  
    //print("q="+q+" ID="+ID+", Note="+Note+",Pos="+Pos); 
    
    ListElement=FList_Dir1.get(Pos);
    ListElement.set_property(StrNotePropertyName,Note);
    ListElement.set_property(StrStatePropertyName,State );
    FList_Dir1.replace(ListElement,Pos);
   }
   ShowWindowBeforSave=false;//замах на будущее - можно показать окно а из него уже получить сигнал от его кнопки типа сохраняй!
   
   if (ShowWindowBeforSave)
   { //покажем итоговый результат. что бы пользователь действительно согласился.
     TreeWidget2=FList_Dir1.create_tree_widget(""+StrStatePropertyName+","+StrNotePropertyName);
     TreeWidget2.hide_all_buttons();
     TreeWidget2.show();
     /*тут ещё надо описать функцию и связать её с кнопкой подстверждения*/
     return 0; 
   }  
   
  // ну а пока просто созраняем.
   filebot=new t_FileBot;
   newfile=DirXmlFile+".old."+BBot.date_time("yyyy.MM.dd_hhmmss");
   print ("Backuping file to:"+DirXmlFile+".old."+BBot.date_time("yyyy.MM.dd_hhmmss")+"");
   rez1=filebot.rename_file(DirXmlFile,newfile);// <<-- на выходе bool
   if (!rez1) 
      { 
        print ("ERROR! не удалось переименовать файл.");
        //не вышло сохранить файл.
        BBot.msgbox_information("ОШИБКА!","Не удалось переименовать файл\n");
      };
   
   rez=FList_Dir1.save_to_file(DirXmlFile);
   Message="Исходный файл переименован в "+newfile+". \n\n Результат сохраннения нового файла: \n "+rez;
   BBot.msgbox_information("Сохранение файла.", Message);   
}


main();